# all()：判断可迭代对象中是否所有元素都是真
# any():判断可迭代对象中是否存在任意一个元素为真

x = [1, 1, 0]
print(all(x))  # False：因为存在元素0
print(any(x))  # True：因为存在元素1

y = [1, 1, 9]
print(all(y))  # True：因为所有元素都是真
print(any(y))  # True：因为存在元素1

# enumerate()：用于返回一个枚举对象，它的功能就是将可迭代对象中的每个元素以及从0开始的序号共同构成一个二元组的列表
seasons = ["Spring", "Summer", "Fall", "Winter"]
enu = enumerate(seasons)  # 序号从0开始，当然也可以指定开始序号
print(enu)  # <enumerate object at 0x1072f2400>
print(list(enu))  # [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]

enu = enumerate(seasons, 10)  # 指定开始序号:10
print(enu)  # <enumerate object at 0x105263840>
print(list(enu))  # [(10, 'Spring'), (11, 'Summer'), (12, 'Fall'), (13, 'Winter')]

# zip()：用于创建一个聚合多个可迭代对象的迭代器。它会将作为参数传入的每个可迭代对象的每个元素依次组合成元组，即第 i 个元组包含来自每个参数的第 i 个元素.
x = [1, 2, 3]
y = ['a', 'b', 'c']
zipped = zip(x, y)
print(zipped)  # <zip object at 0x1076538c0>
print(list(zipped))  # [(1, 'a'), (2, 'b'), (3, 'c')]
z = ['一', '二', '三']
zipped = zip(x, y, z)
print(list(zipped))  # [(1, 'a', '一'), (2, 'b', '二'), (3, 'c', '三')]
z = ['I', "II", "III", "V", " IV"]
zipped = zip(x, y, z)  # 只取3个元素，因为 x,y 只有3个元素，虽然 z 有 5个元素
print(list(zipped))  # [(1, 'a', 'I'), (2, 'b', 'II'), (3, 'c', 'III')]
z = ['甲']
zipped = zip(x, y, z)  # 只取1个元素
print(list(zipped))  # [(1, 'a', '甲')]

import itertools

zipped = itertools.zip_longest(x, y, z)
print(list(zipped))  # [(1, 'a', '甲'), (2, 'b', None), (3, 'c', None)]

# map()：会根据提供的函数对指定的可迭代对象的每个元素进行运算，并将返回运算结果的迭代器
mapped = map(ord, "FishC")  # 第一个参数表示传入的函数，第二个参数是一个可迭代对象
print(mapped)  # <map object at 0x104fe0e80>
print(list(mapped))  # [70, 105, 115, 104, 67]

mapped = map(pow, [2, 3, 10], [5, 2, 3])
print(list(mapped))  # [32, 9, 1000] 分别对应 2^5，3^2，10^3(pow(2,5), pow(3,2),pow(10,3))
print([pow(2, 5), pow(3, 2), pow(10, 3)])  # [32, 9, 1000]

# 但是，如果我们后面的可迭代对象的长度不一致，怎么办呢？类似 zip 取最短的
mapped = map(pow, [2, 3, 10], [5, 2])
print(list(mapped))  # [32, 9]

# filter()：根据提供的函数对指定的可迭代对象的每个运算进行运算，并将运算结果为真的运算，以迭代器的形式返回。
filtered = filter(str.islower, "FishC")
print(filtered)  # <filter object at 0x10524bc70>
print(list(filtered))  # ['i', 's', 'h']

# 迭代器跟可迭代对象
mapped = map(ord, "FishC")
for each in mapped:
    print(each)

print(list(mapped))  # [] 因为 mapped 是一个迭代器，迭代过依次之后，就无法从头开始再次迭代，但是可迭代对象是可以重复迭代的

x = [1, 2, 3, 4, 5]
iter2 = iter(x)  # 把一个可迭代对象 x 传入到函数 iter 中，就会返回一个 迭代器
print(type(iter2))  # <class 'list_iterator'>

# next()：逐个将迭代器中的元素提取出来
x = [1, 2, 3, 4, 5]
print("********************************************************************************")
y = iter(x)
print(next(y))  # 1
print(next(y))  # 2
print(next(y))  # 3
print(next(y))  # 4
print(next(y))  # 5
# print(next(y))  # 异常：StopIteration
print(next(y, '没啦，被你掏空了～'))  # 没啦，被你掏空了～
